﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace DADOS.usuario
{
    public class metUsuario
    {

        private SqlConnection _conexao = new SqlConnection(ConfigurationManager.ConnectionStrings["DB_PROAD_SQL"].ConnectionString);
        
        DB_PROAD banco = new DB_PROAD();

        private void FecharConexao(object banco)
        {
            ((DB_PROAD)banco).Connection.Close();
        }

        private void InicializarConexao(object banco)
        {
            ((DB_PROAD)banco).Connection.Open();
        }

        /// <summary>
        /// Incluir usuário
        /// </summary>
        /// <param name="objPro">TB_PROFISSIONAL objPro</param>
        public void Incluir(TB_PROFISSIONAL objPro)
        {
            try
            {
                InicializarConexao(banco);
                banco.AddToTB_PROFISSIONAL(objPro);
                banco.SaveChanges();
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        /// <summary>
        /// Trocar status (Ativar ou Desativar um proficional)
        /// </summary>
        /// <param name="intCodPro">int Código do Usuário</param>
        public void TrocarStatus(int intCodPro)
        {
            try
            {
                InicializarConexao(banco);
                var objPro = banco.TB_PROFISSIONAL.Where(q => q.CO_PROFISSIONAL == intCodPro).FirstOrDefault();
                if(objPro != null)
                {
                    if(objPro.NR_STATUS == 0)
                    {
                        objPro.NR_STATUS = 1;
                    }else
                    {
                        objPro.NR_STATUS = 0;
                    }
                }
                banco.SaveChanges();
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        /// <summary>
        /// Alterar os dados do proficional
        /// </summary>
        /// <param name="objPro">Objeto TB_PROFISSIONAL</param>
        public void Alterar(TB_PROFISSIONAL objPro)
        {
            try
            {
                InicializarConexao(banco);
                var objProBanco = banco.TB_PROFISSIONAL.Where(q => q.CO_PROFISSIONAL == objPro.CO_PROFISSIONAL).FirstOrDefault();

                objProBanco.NO_PROFISSIONAL = objPro.NO_PROFISSIONAL;
                objProBanco.DS_CPF = objPro.DS_CPF;
                objProBanco.CO_CATEGORIA_PROF = objPro.CO_CATEGORIA_PROF;
                objProBanco.DS_EMAIL = objPro.DS_EMAIL;
                objProBanco.DS_TELEFONE = objPro.DS_TELEFONE;
                objProBanco.DS_MICRO_AREA = objPro.DS_MICRO_AREA;
                objProBanco.DS_SENHA = objPro.DS_SENHA;
                objProBanco.CO_PERFIL = objPro.CO_PERFIL;
                objProBanco.NR_STATUS = objPro.NR_STATUS;
                objProBanco.DS_REG_PROFISSIONAL = objPro.DS_REG_PROFISSIONAL;
                
                banco.SaveChanges();
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        /// <summary>
        /// Valida o CPF e a Senha do usuário
        /// </summary>
        /// <param name="strCPF">string CPF</param>
        /// <param name="strSenha">string Senha</param>
        /// <returns>Retorna um objeto</returns>
        public TB_PROFISSIONAL ValidarLogin(string strCPF, string strSenha)
        {
            try
            {
                InicializarConexao(banco);

                var objPro = banco.TB_PROFISSIONAL.Where(q => q.DS_CPF == strCPF && q.DS_SENHA == strSenha && q.NR_STATUS == 1).FirstOrDefault();

                if (objPro != null)
                {
                    objPro.DT_ULT_ACESSO = DateTime.Now;
                    banco.SaveChanges();
                }

                return objPro;

            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        /// <summary>
        /// Verifica se já existe profissional com o mesmo CPF
        /// </summary>
        /// <param name="strCPF">string CPF</param>
        /// <returns>True ou False</returns>
        public Boolean ExisteProficional(string strCPF)
        {

            try
            {
                InicializarConexao(banco);
                var objUSBanco = banco.TB_PROFISSIONAL.Where(q => q.DS_CPF == strCPF).FirstOrDefault();

                if (objUSBanco != null)
                {
                    return false;
                }

            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
            return true;
        }

        /// <summary>
        /// Retorna o objeto Profissional
        /// </summary>
        /// <param name="intCodProf">int intCodProf</param>
        /// <returns>TB_PROFISSIONAL objProf</returns>
        public TB_PROFISSIONAL Selecionar(int intCodProf)
        {
            try
            {
                InicializarConexao(banco);
                var objPro = banco.TB_PROFISSIONAL.Where(q => q.CO_PROFISSIONAL == intCodProf).FirstOrDefault();
                return objPro;
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        /// <summary>
        /// Retonar lista de profissionais conforme regras
        /// </summary>
        /// <param name="strNome">string Nome</param>
        /// <param name="strCPF">string CPF</param>
        /// <param name="strTipo">string Código Categoria</param>
        /// <returns>DataSet</returns>
        public DataSet ListarProficionais(string strNome, string strCPF, string strTipo) 
        {
            DataSet ds = new DataSet();
            
            string Query = "SELECT PROF.CO_PROFISSIONAL,";
	        Query += "        PROF.NO_PROFISSIONAL,";
	        Query += "        PROF.DS_CPF,";
            Query += "        PROF.NR_STATUS,";
	        Query += "        CAT.NO_CATEGORIA,";
	        Query += "        PROF.DS_TELEFONE";
            Query += "    FROM TB_PROFISSIONAL AS PROF";
            Query += "    INNER JOIN TB_CATEGORIA_PROF AS CAT";
		    Query += "        ON CAT.CO_CATEGORIA_PROF = PROF.CO_CATEGORIA_PROF";
            Query += " WHERE 1 = 1";

            if (!string.IsNullOrEmpty(strNome))
            {
                Query += " AND PROF.NO_PROFISSIONAL LIKE '%" + strNome + "%'";
            }

            if (!string.IsNullOrEmpty(strCPF) && strCPF != "___.___.___-__")
            {
                Query += " AND PROF.DS_CPF = '" + strCPF + "'";
            }

            if (!string.IsNullOrEmpty(strTipo) && strTipo != "0")
            {
                Query += " AND CAT.CO_CATEGORIA_PROF = " + strTipo;
            }

            Query += " ORDER BY PROF.NO_PROFISSIONAL";

            SqlCommand cmd = new SqlCommand(Query, _conexao);

            cmd.Connection = _conexao;

            if (_conexao.State == ConnectionState.Closed)
            {
                _conexao.Open();
            }
            SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
            dataAdapter.Fill(ds);

            _conexao.Close();

            return ds;
        }
        
    }
}
